/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2008，所有权利保留。
 * 
 * 项目名：	rumba-web
 * 文件名：	JumpParams.java
 * 模块说明：	
 * 修改历史：
 * Nov 4, 2008 - lxm - 创建。
 */
package com.hd123.rumba.gwt.util.client;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 模块内跳转参数。
 * <p>
 * 
 * 其中包括了三部分参数：
 * <ol>
 * <li>可以通过url的hash部分（#引导的）传递的参数。参见{@link #getParams()}。
 * <li>扩展用户对象参数，可以传递任意复杂对象，但不可被作为必须的参数。参见
 * {@link #getUserObjects()}。
 * <li>可以被MessagePanel接受的消息列表，列表的元素必须是{@link MessageRecord}。参见
 * {@link #getMessages()}。
 * </ol>
 * 
 * @author lxm
 * 
 */
public class JumpParams implements Serializable {

  private static final long serialVersionUID = 300100L;

  public static final String KEY_STARTNODE = "start";

  /** <java.lang.String, java.lang.String> */
  private HashMap urlParams = new HashMap();

  /** <java.lang.String, java.io.Serializable> */
  private HashMap userObjects = new HashMap();

  /** <com.hd123.rumba.gwt.widget2.client.RJumpParams.MsgRcd> */
  private List messages = new ArrayList();

  /**
   * 创建对象。
   */
  public JumpParams() {
    super();
  }

  /**
   * 创建对象。
   * 
   * @param startNode
   *          指定url参数的start参数取值。
   */
  public JumpParams(String startNode) {
    super();
    setStartNode(startNode);
  }

  /**
   * 取得所有的url参数。
   * 
   * @return
   */
  public HashMap getUrlParams() {
    return urlParams;
  }

  /**
   * 添加一个url参数。
   * 
   * @param key
   *          参数名
   * @param value
   *          参数值
   */
  public void putUrlParam(String key, String value) {
    urlParams.put(key, value);
  }

  /**
   * 添加一个url参数。
   * 
   * @param key
   *          参数名
   * @param value
   *          参数值
   */
  public void put(String key, String value) {
    putUrlParam(key, value);
  }

  /**
   * 取得指定名称的url参数。
   * 
   * @param key
   *          参数名
   * @return 参数值
   */
  public String getUrlParam(String key) {
    return (String) urlParams.get(key);
  }

  /**
   * 取得指定名称的url参数。
   * 
   * @param key
   *          参数名
   * @return 参数值
   */
  public String get(String key) {
    return getUrlParam(key);
  }

  /**
   * 取得url参数中“start=”的取值。
   * 
   * @return
   */
  public String getStartNode() {
    return (String) urlParams.get(KEY_STARTNODE);
  }

  /**
   * 设置url参数中的“start=”的取值。
   * 
   * @param startNode
   */
  public void setStartNode(String startNode) {
    urlParams.put(KEY_STARTNODE, startNode);
  }

  /**
   * 取得所有的扩展用户对象参数。
   * 
   * @return
   */
  public HashMap getUserObjects() {
    return userObjects;
  }

  public void setUserObjects(HashMap userObjects) {
    this.userObjects = userObjects;
  }

  /**
   * 添加或修改一个扩展用户对象参数。
   * 
   * @param key
   *          参数名
   * @param value
   *          参数值
   */
  public void putUserObject(String key, Serializable value) {
    userObjects.put(key, value);
  }

  /**
   * 取得指定名称的扩展用户对象参数。
   * 
   * @param key
   *          参数名
   * @return 用户对象。
   */
  public Serializable getUserObject(String key) {
    return (Serializable) userObjects.get(key);
  }

  /**
   * 清除已有的消息。
   */
  public void clearMessage() {
    messages.clear();
  }

  /**
   * 添加一个消息。
   * 
   * @param msgRcd
   */
  public void addMessage(MessageRecord msgRcd) {
    if (msgRcd == null)
      return;
    messages.add(new MsgRcd(msgRcd));
  }

  /**
   * 批量添加消息。
   * 
   * @param msgRcds
   */
  public void addMessages(List msgRcds) {
    if (msgRcds == null)
      return;
    for (int i = 0, n = msgRcds.size(); i < n; i++) {
      MessageRecord msgRcd = (MessageRecord) msgRcds.get(i);
      addMessage(msgRcd);
    }
  }

  /**
   * 取得所有的消息的列表。
   * 
   * @return
   */
  public List<MessageRecord> toMessageRecords() {
    List list = new ArrayList();
    for (int i = 0, n = messages.size(); i < n; i++) {
      MsgRcd message = (MsgRcd) messages.get(i);
      list.add(message.toMessageRecord());
    }
    return list;
  }

  private static class MsgRcd {
    //
    //    private static final long serialVersionUID = 300100L;

    private String id;
    private String action = MessageRecord.ACTION_PUT;
    private String message;
    private int level = MessageRecord.LEVEL_INFO;

    public MsgRcd(MessageRecord rcd) {
      super();
      this.id = rcd.getId();
      this.action = rcd.getAction();
      this.message = rcd.getMessage();
      this.level = rcd.getLevel();
    }

    public MessageRecord toMessageRecord() {
      MessageRecord rcd = null;
      if (MessageRecord.ACTION_PUT.equals(action))
        rcd = MessageRecord.newPut(id, message, level, null);
      else
        rcd = MessageRecord.newRemove(id);
      return rcd;
    }

    public String getId() {
      return id;
    }

    public void setId(String id) {
      this.id = id;
    }

    public String getAction() {
      return action;
    }

    public void setAction(String action) {
      this.action = action;
    }

    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }

    public int getLevel() {
      return level;
    }

    public void setLevel(int level) {
      this.level = level;
    }
  }

}
